package a12_SeqList.Stack;

import java.util.Arrays;
import java.util.NoSuchElementException;

/**
 * @Author quan
 * @Description 用数组实现栈
 * @Date 2023/3/21 19:19
 */
public class MyStack<E> {
    private Object[] array;//定义一个泛型数组
    private int size;//定义一个默认的数组大小
    //构造方法:默认的数组大小
    public MyStack() {
        this(10);//注意：这里的this就是下面的MyStack
    }
    //有参数传入自定义的数组大小
    public MyStack(int capacity) {
        this.array = new Object[capacity];
    }
    /**
     * 入栈：利用数组实现入栈，相当于栈顶在数组的尾部，直接将元素值在数组中实现尾插，也就是size位置
     */
    public void push(E element){
        array[size] = element;//尾插
        size++;//更新节点数
        if(array.length == size){//判断插入元素后数组的长度：是否需要扩容
            array = Arrays.copyOf(array,array.length<<1);
        }
    }
    /**
     * 出栈：在数组尾部返回size-1位置上的值
     */
    public E pop(){
        //边界条件:判断当前数组是否为空
        if(!isEmpty()){
            throw new NoSuchElementException("stack is empty");
        }
        //返回size-1位置上的值，也就是栈顶值
        E val = (E)array[size-1];
        size--;//更新元素个数
        return val;
    }
    /**
     * 判断当前数组是否为空
     */
    private boolean isEmpty() {
        if(size == 0){
            return false;
        }
        return true;
    }
    /**
     * 查看栈顶元素：在数组尾部返回size-1位置上的值
     */
    public E peek(){
        //边界条件:判断当前数组是否为空
        if(!isEmpty()){
            throw new NoSuchElementException("stack is empty");
        }
        //返回size-1位置上的值，也就是栈顶值
        E val=  (E)array[size-1];
        return val;
    }
    /**
     * 重写toString方法
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("bottom[");
        for (int i = 0; i < size; i++) {
            sb.append(array[i]);
            if(i < size-1){
                sb.append(",");
            }
        }
        sb.append("]top");
        return sb.toString();
    }
}
